#类定义
class Myclass:
    i = 232
    def f(slef):
        return "hekklo"
    
x = Myclass() #类实列化
print("类的属性i为：",x.i)
print("类的方法f输出为：",x.f())

#__init__ ()构造方法 用来做内部初始化

class Myclass:
    def __init__(self,a,b):
        self.a = a
        self.b = b
        print("当前被执行")

x = Myclass(2,3)
print(x.a,x.b)


#self 代表类的实例
class Test:
    def prt(self):#定义的时候必须要有
        print(self)
        print(self.__class__)
t = Test()
t.prt()

#类方法
class people:
    name = ""
    age = 0
    __weight = 0 #私有的
    def __init__(self,n,a,w):#初始化
        self.name = n
        self.age = a
        self.__weight = w
    def speak(self):
        print("hello 我是{},我今年{}岁了".format(self.name,self.age))

p = people("hx",18,110)
p.speak()


#继承
class student(people):#继承people
    grade = ""
    def __init__(self, n, a, w,g):
        people.__init__(self,n,a,w)
        self.grade = g
    def speak(self):
        print("大家好，我是{}，我今年{}岁，读{}年级".format(self.name,self.age,self.grade))

student1 = student("hx",18,110,5)
student1.speak()

#方法重写
class Parent:
    def myMethod(self):
        print("调用父类方法")
class Child(Parent):
    def myMethod(self):
        print("调用子类方法")

c = Child()
c.myMethod()
super(Child,c).myMethod() #super函数调用父类方法

#类的属性与方法
##类的私有属性 __private_attrs 私有属性
##私有方法 __priviate_method  私有方法
class JustCounter:
    __secretCount = 0
    publicCount = 0
    def count(self):
        self.__secretCount +=1
        self.publicCount += 1
        print(self.__secretCount)

counter = JustCounter()
counter.count()
counter.count()
print(counter.publicCount)
# print(counter.__secretCount)#不能直接访问私有变量 只能通过成员函数访问私有变量

class Site:
    def __init__(self,name,url):
        self.name = name
        self.url = url

    def __foo(self):
        print("这是私有方法")
    def foo(self):
        print("这是公有方法")
        self.__foo()
        print("调用完私有方法")
s = Site("hx","www.baidu.com")
# s.__foo()#私有方法不能直接调用
s.foo()


#类的专有方法
"""
1. __init__() ：构造函数 在生成对象时调用
2. __del__() : 构造函数 释放对象时使用
3 __repr__() : 打印 转换
4. __setitem__() : 按照索引赋值 "list(a),a[idx]"
5.__getitem__() : 按照索引获取值
6.__len__():能够获得长度 len(obj)
7 __cmp__() ：比较运算
8 __call__() ：函数调用
9 __sub__() :加运算
"""
#运算符重载

class Vector:
    def __init__(self,a,b):
        self.a = a
        self.b = b
    def __str__(self): #类的专有打印的方法
        print("调用vector打印")
        return "Vector(%d,%d) " % (self.a,self.b)
    
    def __add__(self,other): #类的专有加的方法
        return Vector((self.a + other.a),(self.b + other.b))
    
v1 = Vector(2,10)
v2 = Vector(5,-1)
v3 = v1 + v2
print(v3)
print(v1)
print(v1 + v2)
